package negocio;

import entidades.Cliente;
import entidades.Fornecedor;
import entidades.Funcionario;
import entidades.Produto;
import entidades.Venda;
import java.io.IOException;
import java.util.ArrayList;
import persistencia.ClienteDAO;
import persistencia.FornecedorDAO;
import persistencia.FuncionarioDAO;
import persistencia.ProdutoDAO;
import persistencia.VendaDAO;


public class Central {
    
    private ArrayList<Produto> produtoArray;
    private ArrayList<Cliente> clienteArray;
    private ArrayList<Funcionario> funcionarioArray;
    private ArrayList<Fornecedor> fornecedorArray;
    private ArrayList<Venda> vendaArray;
    private ProdutoDAO produtoDao;
    private ClienteDAO clienteDao;
    private FornecedorDAO fornecedorDao;
    private FuncionarioDAO funcionarioDao;
    private VendaDAO vendaDao;
    
    
    private Funcionario funcionarioUtilizando;
    
    public Central(){
        try {
            produtoDao = new ProdutoDAO();      
            clienteDao = new ClienteDAO();            
            fornecedorDao = new FornecedorDAO();
            funcionarioDao = new FuncionarioDAO();
            vendaDao = new VendaDAO(this);
            produtoArray = produtoDao.carrega();
            clienteArray = clienteDao.carrega();
            fornecedorArray = fornecedorDao.carrega();
            funcionarioArray = funcionarioDao.carrega();
            vendaArray = vendaDao.carrega();
        } catch (Exception ex) {
            Util.erro(ex.getMessage());
        }
    }
    
    
    

    public ArrayList<Produto> getProdutoArray() {
        return produtoArray;
    }

    public void setProdutoArray(ArrayList<Produto> produtoArray) {
        this.produtoArray = produtoArray;
    }

    public ArrayList<Cliente> getClienteArray() {
        return clienteArray;
    }

    public void setClienteArray(ArrayList<Cliente> clienteArray) {
        this.clienteArray = clienteArray;
    }

    public ArrayList<Funcionario> getFuncionarioArray() {
        return funcionarioArray;
    }

    public void setFuncionarioArray(ArrayList<Funcionario> funcionarioArray) {
        this.funcionarioArray = funcionarioArray;
    }

    public ArrayList<Fornecedor> getFornecedorArray() {
        return fornecedorArray;
    }

    public void setFornecedorArray(ArrayList<Fornecedor> fornecedorArray) {
        this.fornecedorArray = fornecedorArray;
    }

    public ArrayList<Venda> getVendaArray() {
        return vendaArray;
    }

    public void setVendaArray(ArrayList<Venda> vendaArray) {
        this.vendaArray = vendaArray;
    }

    public Funcionario getFuncionario() {
        return funcionarioUtilizando;
    }

    public void setFuncionario(Funcionario funcionario) {
        this.funcionarioUtilizando = funcionario;
    }
    
    
    
    
    
    // Comunicação com presistencia
    
    public void insereProduto(Produto produto) throws IOException {
        int id = (produtoArray.isEmpty())?0:produtoArray.get(produtoArray.size()-1).getIdProduto()+1;
        produto.setIdProduto(id);
        produtoDao.insere(produto);
        produtoArray.add(produto);
    }

    public void insereFornecedor(Fornecedor fornecedor) throws IOException {
        int id = (fornecedorArray.isEmpty())?0:fornecedorArray.get(fornecedorArray.size()-1).getIdFornecedor()+1;
        fornecedor.setIdFornecedor(++id);
        fornecedorDao.insere(fornecedor);
        fornecedorArray.add(fornecedor);
    }
    
    public void insereCliente(Cliente cliente) throws IOException{
        int id = (clienteArray.isEmpty())?0:clienteArray.get(clienteArray.size()-1).getIdCliente()+1;
        cliente.setIdCliente(++id);
        clienteDao.insere(cliente);
        clienteArray.add(cliente);
    }
    
    public void realizaVenda(Venda venda) throws IOException{
        int id = (vendaArray.isEmpty())?0:vendaArray.get(vendaArray.size()-1).getIdVenda()+1;
        venda.setIdVenda(id);
        vendaDao.insere(venda);
        vendaArray.add(venda);
        for(int i=0;i<venda.getProdutoArray().size();i++){
            Produto p = venda.getProdutoArray().get(i);
            p.setQuantidade(p.getQuantidade()-venda.getQuantidadeArray().get(i));
        }
        produtoDao.modifica(produtoArray);
    }
    
    public void modificaCliente() throws IOException {
        clienteDao.modifica(clienteArray);
    }

    public void modificaFornecedor() throws IOException {
        fornecedorDao.modifica(fornecedorArray);
    }

    public void modificaProduto() throws IOException {
        produtoDao.modifica(produtoArray);
    }

    
    
    public void removeFornecedor(Fornecedor fornecedor) throws IOException {
        fornecedorDao.remove(fornecedorArray, fornecedor);
        fornecedorArray.remove(fornecedor);
    }

    public void removeProduto(Produto produto) throws IOException {
        produtoDao.remove(produtoArray, produto);
        produtoArray.remove(produto);
    }

    public void removeCliente(Cliente cliente) throws IOException {
        clienteDao.remove(clienteArray, cliente);
        clienteArray.remove(cliente);
    }

    
    public void quitaVenda(Venda venda) throws IOException {
        venda.setStatus("quitada");
        vendaDao.modifica(vendaArray);
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    public Produto buscaProduto(int id){
        for(Produto p : getProdutoArray()) if(p.getIdProduto()==id) return p;
        return null;
    }
   
    public Cliente buscaCliente(int id) {
        for(Cliente c : getClienteArray()) if(c.getIdCliente()==id) return c;
        return null;
    }

    public Funcionario buscaFuncionario(int id) {
        for(Funcionario f : getFuncionarioArray()) if(f.getIdFuncionario()==id) return f;
        return null;
    }

    public String[] getNomesDosFuncionarios() {
        String[] nomes = new String[funcionarioArray.size()];
        for(int i=0;i<funcionarioArray.size();i++){
            Funcionario f = funcionarioArray.get(i);
            nomes[i] = f.getNome() + " ("+((f.getTipo()==0)?"gerente":"vendedor")+")";
        }
        return nomes;
    }
    
        


}
